package com.ruoyi.web.controller.app;

import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.common.core.domain.model.LoginAppBody;
import com.ruoyi.common.core.domain.model.WXLoginDTO;
import com.ruoyi.framework.web.service.AppLoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

import static com.ruoyi.common.constant.Constants.APP_API_PREFIX;

/**
 * 登录验证
 *
 * @author ruoyi
 */
@Api("APP登录管理")
@RestController
@RequestMapping(APP_API_PREFIX)
public class AppLoginController extends BaseController {
    @Resource
    private AppLoginService appLoginService;

    @ApiOperation("登录")
    @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginAppBody loginAppBody) {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        String token = appLoginService.login(loginAppBody.getUsername(), loginAppBody.getPassword(), null, null);
        ajax.put(Constants.TOKEN, token);
        return ajax;
    }

    /**
     * 整体流程
     * 1.前端通过wx.login 获取 js_code
     * 2.将获取的js_code发送给后端
     * 3.后端拿到js_code，小程序 appId，小程序 appSecret，grant_type（参数默认写死为authorization_code）
     * 4.将上述四个参数通过GET请求发送给微信小程序登录接口，请求地址：https://api.weixin.qq.com/sns/jscode2session
     * 5.请求成功后拿到响应参数：session_key（会话密钥），unionid（用户在开放平台的唯一标识符），errmsg（错误信息），openid（用户唯一标识），errcode（错误代码）
     * 6.我们可以拿openid（用户唯一标识）当作数据库表中的唯一字段，如上述APP登录时候的user_name（用户账号）
     * 7.后续登陆时拿openid进行认证即可
     */
    @ApiOperation("微信小程序登录")
    @PostMapping("/minLogin")
    public AjaxResult minLogin(@RequestBody WXLoginDTO wxLoginBody) {


        return appLoginService.minLogin(wxLoginBody);
    }

    @ApiOperation("根据token获取用户信息")
    @GetMapping("/userInfo")
    @Anonymous
    public AjaxResult userInfo() {
        AppUser appUser = getLoginAppUser().getAppUser();
        AjaxResult ajax = AjaxResult.success();
        ajax.put("appUser", appUser);
        return ajax;
    }
}
